#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

typedef struct DNode
{
    ElemType data;
    struct DNode *prior, *next;
} DNode, *DLinkList;

bool InitList(DLinkList &L);
bool IsEmpty(DLinkList L);
bool IsTail(DLinkList L, DNode *p);
bool InitDList(DLinkList &L);
bool IsDEmpty(DLinkList L);
bool IsDTail(DLinkList L, DNode *p);

int main() {}

// 初始化空的循环单链表
bool InitList(DLinkList &L)
{
    L = (DLinkList)malloc(sizeof(DNode));
    if (L == NULL)
        return false;
    L->next = L; // 头结点的next指向头结点
    return true;
}

// 判断是否为空
bool IsEmpty(DLinkList L)
{
    return L->next == L;
}

// 判断结点p是否为循环单链表的表尾结点
bool IsTail(DLinkList L, DNode *p)
{
    return p->next == L;
}

// 分界线===================================================================

// 初始化空的循环双链表
bool InitDList(DLinkList &L)
{
    L = (DLinkList)malloc(sizeof(DNode));
    if (L == NULL)
        return false;
    // 头结点的next和prior指针都指向头结点
    L->next = L;
    L->prior = L;
    return true;
}

// 判断是否为空
bool IsDEmpty(DLinkList L)
{
    return L->next == L;
}

// 判断结点p是否为循环双链表的表尾结点
bool IsDTail(DLinkList L, DNode *p)
{
    return p->next == L;
}
